use tauri;

#[cfg(target_os = "windows")]
use windows::Win32::UI::WindowsAndMessaging::{SystemParametersInfoW, SPI_GETWORKAREA};

// 获取屏幕工作区信息
#[cfg(target_os = "windows")]
pub fn get_screen_work_area() -> (i32, i32, i32, i32) {
    use windows::Win32::Foundation::RECT;

    unsafe {
        let mut work_area = RECT::default();
        let result = SystemParametersInfoW(
            SPI_GETWORKAREA,
            0,
            Some(&mut work_area as *mut _ as *mut _),
            windows::Win32::UI::WindowsAndMessaging::SYSTEM_PARAMETERS_INFO_UPDATE_FLAGS(0),
        );

        if result.as_bool() {
            println!("工作区: left={}, top={}, right={}, bottom={}",
                work_area.left, work_area.top, work_area.right, work_area.bottom);
            (work_area.left, work_area.top, work_area.right, work_area.bottom)
        } else {
            // 如果获取工作区失败，使用屏幕尺寸
            use windows::Win32::UI::WindowsAndMessaging::{GetSystemMetrics, SM_CXSCREEN, SM_CYSCREEN};
            let screen_width = GetSystemMetrics(SM_CXSCREEN);
            let screen_height = GetSystemMetrics(SM_CYSCREEN);
            println!("使用屏幕尺寸: {}x{}", screen_width, screen_height);
            (0, 0, screen_width, screen_height)
        }
    }
}

// 获取屏幕尺寸并计算右上角位置
#[cfg(target_os = "windows")]
pub fn get_top_right_position() -> (i32, i32) {
    let (work_left, work_top, work_right, work_bottom) = get_screen_work_area();

    // 窗口尺寸 (从配置中获取)
    let window_width = 300;
    let window_height = 420;

    // 工作区的实际宽度和高度
    let work_width = work_right - work_left;
    let work_height = work_bottom - work_top;

    // 计算右上角位置，确保窗口完全在工作区内
    let x = work_left + work_width - window_width - 10; // 右边留10像素边距
    let y = work_top + 50; // 上边留50像素边距

    // 确保位置不会超出工作区边界
    let final_x = x.max(work_left).min(work_right - window_width);
    let final_y = y.max(work_top).min(work_bottom - window_height);

    println!("工作区尺寸: {}x{}, 窗口尺寸: {}x{}, 计算位置: ({}, {})",
        work_width, work_height, window_width, window_height, final_x, final_y);

    (final_x, final_y)
}

#[cfg(not(target_os = "windows"))]
pub fn get_top_right_position() -> (i32, i32) {
    // 在非Windows平台上，使用默认位置
    (1000, 50)
}

// 严格检查并修正窗口位置，确保窗口完全在工作区内
#[cfg(target_os = "windows")]
pub fn validate_and_fix_position(x: i32, y: i32) -> (i32, i32) {
    // 在多显示器环境下，我们放宽限制，允许窗口在任何合理的位置
    // 只要不是完全离屏就允许

    // 窗口尺寸
    let window_width = 300;
    let window_height = 420;

    // 获取所有显示器的边界
    let all_monitors_bounds = get_all_monitors_bounds();

    // 检查窗口是否完全在所有显示器之外
    if is_window_off_all_monitors(x, y, window_width, window_height, &all_monitors_bounds) {
        // 如果窗口完全离屏，则将其移动到主显示器的工作区
        let (work_left, work_top, work_right, work_bottom) = get_screen_work_area();
        let fixed_x = x.max(work_left).min(work_right - window_width);
        let fixed_y = y.max(work_top).min(work_bottom - window_height);
        (fixed_x, fixed_y)
    } else {
        // 如果窗口至少部分可见，则保持原位置
        (x, y)
    }
}

#[cfg(not(target_os = "windows"))]
pub fn validate_and_fix_position(x: i32, y: i32) -> (i32, i32) {
    // 在非Windows平台上，使用默认屏幕尺寸进行检查
    let screen_width = 1920;  // 假设默认屏幕宽度
    let screen_height = 1080; // 假设默认屏幕高度
    let window_width = 300;
    let window_height = 420;

    let fixed_x = if x < 0 {
        0
    } else if x + window_width > screen_width {
        screen_width - window_width
    } else {
        x
    };

    let fixed_y = if y < 0 {
        0
    } else if y + window_height > screen_height {
        screen_height - window_height
    } else {
        y
    };

    (fixed_x, fixed_y)
}

// 检查位置是否需要修正
pub fn position_needs_correction(current_x: i32, current_y: i32, fixed_x: i32, fixed_y: i32) -> bool {
    current_x != fixed_x || current_y != fixed_y
}

// 获取窗口实际尺寸的函数（静默版本，减少日志输出）
#[cfg(target_os = "windows")]
pub fn get_actual_window_size(window: &tauri::WebviewWindow) -> (i32, i32) {
    match window.outer_size() {
        Ok(size) => (size.width as i32, size.height as i32),
        Err(_) => (300, 420) // 默认尺寸
    }
}

// 基于实际窗口尺寸的位置验证（只在需要时输出日志）
#[cfg(target_os = "windows")]
pub fn validate_position_with_actual_size(window: &tauri::WebviewWindow, x: i32, y: i32, log_changes: bool) -> (i32, i32) {
    // 在多显示器环境下，我们放宽限制，允许窗口在任何合理的位置
    // 只要不是完全离屏就允许

    let (actual_width, actual_height) = get_actual_window_size(window);

    // 获取所有显示器的边界
    let all_monitors_bounds = get_all_monitors_bounds();

    // 检查窗口是否完全在所有显示器之外
    if is_window_off_all_monitors(x, y, actual_width, actual_height, &all_monitors_bounds) {
        // 如果窗口完全离屏，则将其移动到主显示器的工作区
        let (work_left, work_top, work_right, work_bottom) = get_screen_work_area();
        let fixed_x = x.max(work_left).min(work_right - actual_width);
        let fixed_y = y.max(work_top).min(work_bottom - actual_height);

        // 只在需要时输出日志
        if log_changes && (fixed_x != x || fixed_y != y) {
            println!("位置修正: ({}, {}) -> ({}, {})", x, y, fixed_x, fixed_y);
            println!("实际窗口尺寸: {}x{}", actual_width, actual_height);
            println!("修正后窗口边界: 左={}, 上={}, 右={}, 下={}",
                fixed_x, fixed_y, fixed_x + actual_width, fixed_y + actual_height);
        }

        (fixed_x, fixed_y)
    } else {
        // 如果窗口至少部分可见，则保持原位置
        (x, y)
    }
}

// 获取所有显示器的边界（简化实现）
#[cfg(target_os = "windows")]
fn get_all_monitors_bounds() -> Vec<(i32, i32, i32, i32)> {
    // 当前简化实现，只返回一个足够大的区域，覆盖常见的多显示器设置
    // 实际应用中应该使用 Tauri 或 Windows API 获取所有显示器的确切边界
    vec![(-4000, -4000, 8000, 8000)] // 假设一个足够大的区域
}

// 检查窗口是否完全在所有显示器之外
#[cfg(target_os = "windows")]
fn is_window_off_all_monitors(x: i32, y: i32, width: i32, height: i32, monitors: &[(i32, i32, i32, i32)]) -> bool {
    for &(left, top, right, bottom) in monitors {
        // 检查窗口是否与当前显示器相交
        if x < right && x + width > left && y < bottom && y + height > top {
            return false; // 窗口至少部分在显示器上可见
        }
    }
    true // 窗口完全在所有显示器之外
}
